var url = require('url');
var logger = require('../tools/logger');
var redis = require('../tools/redis');
var fetch = require('node-fetch');
var parseString = require('xml2js').parseString;

module.exports = function (req, res) {
    var ip = req.headers['x-forwarded-for'] ||
        req.connection.remoteAddress ||
        req.socket.remoteAddress ||
        req.connection.socket.remoteAddress;

    var query = url.parse(req.url,true).query;
    var aid = query.aid;

    function addZero(str, length){
        return new Array(length - str.length + 1).join("0") + str;
    }

    redis.client.get(`bilibili${aid}`, function(err, reply) {
        if (reply) {
            logger.info(`Bilibili AV${aid} form redis, IP: ${ip}`);
            res.send(reply);
        }
        else {
            logger.info(`Bilibili AV${aid} form origin, IP: ${ip}`);

            var dan = {
                code: 1,
                danmaku: []
            };

            fetch(`http://www.bilibili.com/widget/getPageList?aid=${aid}`).then(
                response => response.json()
            ).then((data) => {
                    fetch(`http://comment.bilibili.com/${data[0].cid}.xml`).then(
                        response => response.text()
                    ).then((data) => {
                            parseString(data, function (err, result) {
                                var danOriginal = result.i.d;
                                for (var i = 0; i < danOriginal.length; i++) {
                                    var info = danOriginal[i].$.p.split(',');
                                    var type = '';
                                    if (info[1] === '4') {
                                        type = 'bottom';
                                    }
                                    else if (info[1] === '5') {
                                        type = 'top';
                                    }
                                    else {
                                        type = 'right';
                                    }
                                    var danOne = {
                                        author: 'bilibili' + info[6],
                                        time: info[0],
                                        text: danOriginal[i]._,
                                        color: '#' + addZero(parseInt(info[3]).toString(16), 6),
                                        type: type
                                    };
                                    dan.danmaku.push(danOne);
                                }
                                var sendDan = JSON.stringify(dan);
                                res.send(sendDan);

                                redis.set(`bilibili${aid}`, sendDan);
                            });
                        }
                    ).catch(
                        e => logger.error("Bilibilib Error: getting danmaku", e)
                    );
                }
            ).catch(
                e => logger.error("Bilibilib Error: getting cid", e)
            );
        }
    });
};